#ifndef PLAYFAB_<%- api.name.toUpperCase() %>_DATA_MODELS_H_
#define PLAYFAB_<%- api.name.toUpperCase() %>_DATA_MODELS_H_

#include "PlayFabBaseModel.h"

namespace PlayFab
{
    namespace <%- api.name %>Models
    {
<% for(var i in datatypes) { var datatype = datatypes[i]; if (datatype.isenum) { %>        enum <%- datatype.name %>
        {
            <% for(var i=0; i<datatype.enumvalues.length-1; i++) { var enumval = datatype.enumvalues[i] %><%- datatype.name %><%- enumval.name %>,
            <% } %><%- datatype.name %><%- datatype.enumvalues[datatype.enumvalues.length-1].name %>
        };

        void write<%- datatype.name %>EnumJSON(<%- datatype.name %> enumVal, PFStringJsonWriter& writer);
        <%- datatype.name %> read<%- datatype.name %>FromValue(const rapidjson::Value& obj);

<% } else { %><%- getDeprecationAttribute("        ", datatype)
%>        struct <%- datatype.name %> : public PlayFabBaseModel
        {
<% for(var i in datatype.properties) { var property = datatype.properties[i]
%><%- getPropertyDef("            ", property, datatype) %>
<% } %>
            <%- datatype.name %>() :
                PlayFabBaseModel()<% for(var i in datatype.properties) { var property = datatype.properties[i] %>,
                <%- getPropertySafeName(property) %>(<%- getPropertyDefaultValue(property, datatype) %>)<% } %>
            {}

            <%- datatype.name %>(const <%- datatype.name %>& src) :
                PlayFabBaseModel()<% for(var i in datatype.properties) { var property = datatype.properties[i] %>,
                <%- getPropertySafeName(property) %>(<%- getPropertyCopyValue(property) %>)<% } %>
            {}

            <%- datatype.name %>(const rapidjson::Value& obj) : <%- datatype.name %>()
            {
                readFromValue(obj);
            }

            ~<%- datatype.name %>();

            void writeJSON(PFStringJsonWriter& writer);
            bool readFromValue(const rapidjson::Value& obj);
        };

<% } } %>
    }
}

#endif
